home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 106_01 / iofun.asm < prev    next >
Assembly Source File  |  1980-07-08  |  3KB  |  127 lines

  1. ;                iofun.asm
  2. ;
  3. ;    Copyright (C) 1980, M J Maney
  4. ;
  5. ;    First created 8/30/80
  6. ;    Last revised 9/26/80 15:25
  7. ;
  8. ;    Tested and installed xx/xx/xx
  9. ;
  10. ;    Since I/O is such a big part of most programs, it would seem logical
  11. ;    to desire your I/O functions to be as efficent as possible. This
  12. ;    especially applies to the buffered character I/O that C uses for
  13. ;    disk communication. These routines can dominate the run-time of
  14. ;    programs that don't do extensive computation, and may affect the
  15. ;    speed of some that are rather heavily computational. Thus they are
  16. ;    being coded here in assembler.
  17. ;*
  18. ;*    I have removed the 'overlapping' code reffered to in read.me,
  19. ;*    but this is still entirely untested. You have been warned.
  20. ;
  21. ;
  22.     maclib    crl
  23. ;
  24. ;
  25. ;    getc(iobuf)
  26. ;    FILBUF *iobuf;
  27. ;
  28. ;    This is the basic C character I/O function. It returns one byte from
  29. ;    the buffered file described by the FILBUF that iobuf points to,
  30. ;    and takes care of the buffer management. The structure of the
  31. ;    file buffer is:
  32. ;
  33. ;    byte offset        what's there
  34. ;
  35. ;    0,1            file's 'file descriptor', used in calls
  36. ;                to read, etc
  37. ;    2,3            nleft, the number of bytes left before
  38. ;                the buffer is depleted and must be filled
  39. ;    4,5            nextp, the pointer into the buffer
  40. ;    6,133            buff, the 128 byte buffer
  41. ;
  42. ;    This function is operationally identical to the C version in the
  43. ;    "stdlib1.c" file distributed with the 1.32 release of the BDS
  44. ;    compiler, and except for a little re-arrangement at the very end,
  45. ;    it is a straight hand translation from that source.
  46. ;
  47.     PROC    GETC,<GETCHAR,READ>
  48.     lhld    ARG1
  49.     mov    a,h
  50.     ora    l
  51.     BNZ    getc1        ;if (iobuf == 0)
  52.     BSR    GETCHAR
  53.     ret            ;    return getchar();
  54. getc1    inx    h
  55.     inx    h
  56.     mov    e,m
  57.     inx    h
  58.     mov    d,m
  59.     push    d
  60.     dcx    d
  61.     mov    m,d
  62.     dcx    h
  63.     mov    m,e
  64.     pop    d
  65.     mov    a,d
  66.     ora    e
  67.     BZ    getc2        ;if (iobuf->nleft-- .NE. 0)
  68.     inx    h
  69.     inx    h
  70.     mov    e,m
  71.     inx    h
  72.     mov    d,m
  73.     push    d
  74.     inx    d
  75.     mov    m,d
  76.     dcx    h
  77.     mov    m,e
  78.     pop    h
  79.     mov    l,m
  80.     mvi    h,0
  81.     ret            ;    return *iobuf->nleft--;
  82. getc2    dcx    h
  83.     mov    d,m
  84.     dcx    h
  85.     mov    e,m
  86.     push    h
  87.     xchg
  88.     shld    ARG1
  89.     pop    h
  90.     push    h
  91.     lxi    d,6
  92.     dad    d
  93.     shld    ARG2
  94.     lxi    h,1
  95.     shld    ARG3
  96.     BSR    READ
  97.     mov    a,h
  98.     ora    a
  99.     BM    getc3
  100.     ora    l
  101.     BNZ    getc4        ;if (read(iobuf->fd,iobuf->buff,1) <= 0)
  102. getc3    pop    h
  103.     lxi    h,-1
  104.     ret            ;    return ERR;
  105. getc4    pop    h
  106.     inx    h
  107.     inx    h
  108.     lxi    d,127
  109.     mov    m,e
  110.     inx    h
  111.     mov    m,d        ;iobuf->nleft = 127;
  112.     inx    h
  113.     inx    h
  114.     inx    h
  115.     mov    d,h
  116.     mov    e,l
  117.     mov    a,m        ;a = *iobuf->buff;
  118.     inx    d
  119.     dcx    h
  120.     mov    m,d
  121.     dcx    h
  122.     mov    m,e        ;iobuf->nextp = iobuf->buff - 1;
  123.     mov    l,a
  124.     mvi    h,0
  125.     ret            ;return a;
  126.     PEND    GETC
  127.